#include "consumidor.h"
#include <QDebug>
#include <iostream>
#include <limits>

Consumidor::Consumidor(Buffer * buffer)
{
        this->buffer=buffer;
        //qDebug()<<"nasceu um consumidor";
}
void Consumidor::le(){
        int dado=0;
        //qDebug()<<"comecei a ler";
        if(this->buffer->totalProdutosPraLeitura==0){
            ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(TERMINADO));
            this->terminate();
        }
        ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(BLOQUEADOSINCRONISMO));
        this->buffer->semaforoUsados->acquire();
            ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(BLOQUEADOEXCLUSAO));
            this->buffer->mutex2->lock();
        //qDebug()<<"passei do mutex2 leitura";

                this->buffer->totalLeitoresRodada++;
                int pos=this->buffer->posicaoLe;
                this->buffer->posicaoLe=(this->buffer->posicaoLe +1)%this->buffer->bufferSize;
                this->buffer->leiturasMultiplas++;
            this->buffer->mutex2->unlock();
             ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(PRONTO));

                        //fora região critica




                 dado = this->buffer->vetor[pos];
                 this->buffer->vetor[pos]=std::numeric_limits<int>::max();






                       //independente de lock, aqui eu leio e mesmo que leve horas, não interefe nas outras
             ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(BLOQUEADOEXCLUSAO));
            this->buffer->mutex3->lock();
                --this->buffer->totalProdutosPraLeitura;
                this->buffer->le(pos);
             ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(PRONTO));
                        //emite sinal pra gui
                 //QMutex mutexEsperaTratarSinal;
                 //emit leuBuffer(this->buffer->vetor,0,&mutexEsperaTratarSinal);
                       //demora ...
                 sleep(1);
                 this->buffer->setSaidaDoLabelSemaforos(" li "+QString::number(dado)+"\n");
                 this->buffer->setSaidaDoLabelSemaforos("Semaforo Usados = "+QString::number(buffer->semaforoUsados->available())+"  Semaforo Livres = "+QString::number(buffer->semaforoLivres->available()+1)+"\n");
                 this->buffer->showStatus();
                 this->buffer->leiturasMultiplas--;
                 if (this->buffer->leiturasMultiplas == 0){
                     this->buffer->semaforoLivres->release(this->buffer->totalLeitoresRodada);
                     this->buffer->totalLeitoresRodada=0;
                 }
           this->buffer->mutex3->unlock();
                 //qDebug()<<"terminei de ler";

}
void Consumidor::run(){
        while(1){
            ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(PRONTO));
            le();
       }
}
